package com.ruoyi.site.controller;


import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.site.domain.Users;
import com.ruoyi.site.service.IUsersService;
import com.ruoyi.site.vo.AuthVerificationBody;
import com.ruoyi.site.vo.LoginBody;
import com.ruoyi.site.vo.RegisterBody;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.ruoyi.site.service.IAuthService;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.servlet.view.RedirectView;

/**
 * 站点用户认证Controller
 * 路径改为 /site/auth
 */
@RestController
@RequestMapping("/site/auth")
public class AuthController extends BaseController
{
    @Autowired
    private IAuthService authService;

    @Value("${app.frontend-url}")
    private String frontendUrl;

    @Autowired
    private IUsersService usersService;

    /**
     * 用户注册
     * 接收 email, nickname, password
     */
    @PostMapping("/register")
    public AjaxResult register(@RequestBody RegisterBody registerBody)
    {
        if (StringUtils.isAnyBlank(registerBody.getEmail(), registerBody.getNickname(), registerBody.getPassword()))
        {
            return AjaxResult.error("邮箱、昵称和密码不能为空");
        }

        // 假设注册服务实现了所有逻辑：检查重复、创建用户、创建认证记录、发送验证邮件
        try {
            // 返回一个提示信息，包含用户需要验证邮箱
            authService.register(registerBody.getEmail(), registerBody.getNickname(), registerBody.getPassword());
            return AjaxResult.success("注册成功！请检查您的邮箱完成验证。");
        } catch (RuntimeException e) {
            return AjaxResult.error(e.getMessage());
        }
    }

    /**
     * 邮箱验证接口 (用户点击邮件中的链接后，前端携带 code/token 调用此接口)
     */
    @PostMapping("/verifyEmail")
    public AjaxResult verifyEmail(@RequestBody AuthVerificationBody verificationBody)
    {
        if (StringUtils.isAnyBlank(verificationBody.getCode(), verificationBody.getEmail()))
        {
            return AjaxResult.error("验证信息不完整");
        }

        try {
            // 假设验证服务实现了验证码校验、更新isVerified状态、生成JWT Token等
            String token = authService.verifyEmailAndLogin(verificationBody.getEmail(), verificationBody.getCode());
            return AjaxResult.success("邮箱验证成功！", token); // 返回token
        } catch (RuntimeException e) {
            return AjaxResult.error(e.getMessage());
        }
    }

    /**
     * 用户登录 (邮箱/密码)
     * @param loginBody 包含邮箱/昵称和密码
     */
    @PostMapping("/login")
    public AjaxResult login(@RequestBody LoginBody loginBody)
    {
        if (StringUtils.isAnyBlank(loginBody.getEmail(), loginBody.getPassword()))
        {
            return AjaxResult.error("邮箱和密码不能为空");
        }

        try {
            String token = authService.login(loginBody.getEmail(), loginBody.getPassword());
            return AjaxResult.success("登录成功", token);
        } catch (RuntimeException e) {
            return AjaxResult.error(e.getMessage());
        }
    }

    /**
     * Google 认证回调接口
     */
    @GetMapping("/google/callback")
    public RedirectView handleGoogleCallback(@RequestParam("code") String code,
                                             @RequestParam(value = "state", required = false) String state) {
        if (StringUtils.isBlank(code)) {
            // 重定向到前端错误页，使用配置变量
            String errorMsg = "Google authorization failed: " + "code is empty";
            String targetUrl = frontendUrl + "/login-error?msg=" + errorMsg;

            // 使用 RedirectView 封装错误 URL
            return new RedirectView(targetUrl);
        }

        try {
            String jwtToken = authService.handleGoogleLogin(code);
            String targetUrl = frontendUrl + "/auth-success?token=" + jwtToken;

            // 使用 RedirectView 封装目标 URL
            return new RedirectView(targetUrl);

        } catch (Exception e) {
            logger.error("Google 登录处理失败", e);
            // 重定向到前端错误页，使用配置变量
            String errorMsg = "Google authorization failed: " + e.getMessage();
            String targetUrl = frontendUrl + "/login-error?msg=" + errorMsg;

            // 使用 RedirectView 封装错误 URL
            return new RedirectView(targetUrl);
        }
    }
    /**
     * 获取当前登录用户的详细信息
     * 依赖于 JWT token 解析，通过 SecurityUtils 获取 userId
     * @return 包含 Users 数据的 AjaxResult
     */
    @GetMapping("/getInfo")
    public AjaxResult getInfo()
    {
        // 1. 从若依的安全工具类中获取当前登录用户的 userId
        // 假设 tokenService/JWT 解析后，用户ID会被设置到安全上下文中
        Long currentUserId = SecurityUtils.getUserId();

        if (currentUserId == null)
        {
            // 如果无法获取到 userId，说明 token 无效、过期或未登录
            // 尽管 HTTP 拦截器应该在请求到达这里之前就处理了，但作为防御性编程，我们仍需检查
            return AjaxResult.error(401, "User not logged in or token invalid.");
        }

        // 2. 复用 IUsersService 接口，通过 userId 查询完整的 Users 实体
        Users user = usersService.selectUsersByUserId(currentUserId);

        if (user == null)
        {
            // 理论上不应该发生，除非数据库记录被手动删除
            return AjaxResult.error("User profile data not found.");
        }

        // 3. 返回 Users 数据
        return AjaxResult.success(user);
    }
}